package com.cy.pj.common.pool;
/*创建一个对象池类型然后将此类的对象叫个spring管理
* @Component 注解描述的对象可以交给spring对象管理，表示这个对象是一个一般组件
* 系统底层会通过反射技术创建bean对象
*
* 系统底层会通过反射技术创建bean实例 并为bean起个名字
*
* 反射是java中的一种高级特性这组特性会借助API获取运行时类及其的成员 进行操作
* 反射不能预知未来 但是可以驾驭未来
* 应用反射技术的起点是？获取Class对象 （字节码对象）*/
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.sql.SQLOutput;

@Component//此注解描述的对象交给spring去管理 例如创建bean实例，给bean起一个默认名等
@Scope("prototype")//prototype为多例作用域每次spring框架请求类的实例都会创建新的
//@Scope("singleton")//此注解用于设置bean对象的作用域默认是singleton(单例）相同名字的dean实例在内存只能有一份
@Lazy//描述对象类型是表示延迟对象的创建何时需要何时创建
//@Component("objPool")//描述bean的同时,给Bean起给名字.
public class ObjectPool {//默认bean对象的名字为类名，然后首字母小写列如objectpool
    public ObjectPool(){
        System.out.println("ObjectPool()");
    }
    //生命周期方法演示：（并不是每个类中都要写这样的方法-一般在池对象的设计中都会有这样的方法）
@PostConstruct//此注解的方法为对象声明周期初始化方法，此方法会在构造方法之后执行
    public void init(){
    System.out.println("init()");
}
@PostConstruct//此注解描述的方法为对象生命周期销毁方法 此方法会在对象销毁之前执行
public void destriy(){
    System.out.println("destriy");
}
}//此类的配置在被加载到内存是会将累的配置信息储存到,Map<String,BeanDefinition>容器中
//早期创建类的对象是 new ObjectPool()
//spring中为什么会使用反射创建对象 而不是直接new 对象类型的方式呢